1 | // Function<T, R> -T作为输入, 返回的R作为输出 |
方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
应用范围扩大的注解, 可以重复注解, 更好的类型推断
新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
流的特点
只能遍历一次
我们可以把流想象成一条流水线, 流水线的源头是我们的数据源(一个集合), 数据源中的元素依次被输送到流水线上, 我们可以在流水线上对元素进行各种操作。
一旦元素走到了流水线的另一头, 那么这些元素就被“消费掉了” , 我们无法再对这个流进行操作。 当然,
我们可以从数据源那里再获得一个新的流重新遍历一遍。
- 采用内部迭代方式
若要对集合进行处理, 则需我们手写处理代码, 这就叫做外部迭代。
而要对流进行处理, 我们只需告诉流我们需要什么结果, 处理过程由流自行完成, 这就称为内部迭代。
流的操作种类
流的操作分为两种, 分别为中间操作和终端操作。
- 中间操作
当数据源中的数据上了流水线后, 这个过程对数据进行的所有操作都称为“中间操作” 。
中间操作仍然会返回一个流对象, 因此多个中间操作可以串连起来形成一个流水线。
- 终端操作
当所有的中间操作完成后, 若要将数据从流水线上拿下来, 则需要执行终端操作。
终端操作将返回一个执行结果, 这就是你想要的数据
List 转 Stream
1 | // 转stream |
filter( 过滤)
1 | Stream<T> filter(Predicate<? super T> predicate); |
map( 元素转换)
1 | <R> Stream<R> map(Function<? super T, ? extends R> mapper); |
flatMap( 元素转换)
1 | <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper); IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper); |
distinct( 去除重复, 对象需要重写 equals、 hashCode)
1 | Stream<T> distinct(); |
sorted( 排序)
1 | Stream<T> sorted(); |
peek( 生成新的流: 流是单向的, 例如用于日志打印)
1 | Stream<T> peek(Consumer<? super T> action); |
limit( 取前面 n 个元素)
1 | Stream<T> limit(long maxSize); |
skip( 跳过 n 个元素)
1 | Stream<T> skip(long n); |
forEach( 遍历)
1 | void forEach(Consumer<? super T> action); |
toArray( 转换成数组)
1 | Object[] toArray(); |
reduce( 结果归并)
1 | T reduce(T identity, BinaryOperator<T> accumulator); |
collect( 转换成集合)
1 | <R> R collect(Supplier<R> supplier, |
转list
1 | // 转list |
count( 计数)
1 | long count(); |
查找
1 | boolean anyMatch(Predicate<? super T> predicate); |
- Date Time API − 加强对日期与时间的处理。
时区类 java.time.ZoneId
1 | ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai"); |
Instant类在Java日期与时间功能中, 表示了时间线上一个确切的点, 定义为距离初始时间的时间差
1 | // 一个Instant对象里有两个域: 距离初始时间的秒钟数、 在当前一秒内的第几纳秒 |
Clock类提供了访问当前日期和时间的方法, Clock是时区敏感的
1 | // 可以用来取代System.currentTimeMillis() 来获取当前的微秒数。 |
LocalDate类是Java 8中日期时间功能里表示一个本地日期的类, 它的日期是无时区属性的。
1 | LocalDate localDate = LocalDate.now(); |
LocalTime类是Java 8中日期时间功能里表示一整天中某个时间点的类, 它的时间是无时区属性的
1 | LocalTime localTime = LocalTime.now(); |
LocalDateTime类是Java8中无时区的日期时间, 相当于LocalDate与LocalTime两个类的结合,使用方法也类似
1 | LocalDateTime localDateTime = LocalDateTime.now(); |
ZonedDateTime类是Java 8中日期时间功能里, 用于表示带时区的日期与时间信息的类
1 | ZonedDateTime dateTime = ZonedDateTime.now(); |
DateTimeFormatter类是Java 8中日期时间功能里, 用于解析和格式化日期时间的类
1 | // 类中包含如下预定义的实例 |
Duration对象表示两个Instant间的一段时间
1 | Instant first = Instant.now(); |
TemporalAdjuster类可以更方便的调整时间
————————————————————————————
1 | LocalDateTime localDateTime = LocalDateTime.now(); |
- Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
1 | // 参数不能是null |
Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
JVM的新特性 - 使用Metaspace(JEP 122)代替持久代(PermGen space)。在JVM参数方面,使用-XX:MetaSpaceSize和-XX:MaxMetaspaceSize代替原来的-XX:PermSize和-XX:MaxPermSize。